1、部署脚本
#!/bin/bash
set -e  # 脚本出错时立即终止

# 配置参数
SERVICE_NAME="docker.service"
MAX_MAP_COUNT_TARGET=262144
NOFILE_LIMIT=65536
ES_IMAGE="docker.elastic.co/elasticsearch/elasticsearch:8.6.0"
ES_DATA_DIR="./esdata"
IK_PLUGIN_DIR="./esdata/plugins/ik"

# 颜色常量
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'

# 检查目录是否存在
function check_dir_exists() {
    local dir=$1
    if [ -d "$dir" ]; then
        echo -e "${GREEN}? 目录已存在：${dir}${NC}"
        return 0
    else
        echo -e "${RED}× 目录不存在：${dir}${NC}"
        return 1
    fi
}

# 检查并创建目录
function create_dir() {
    local dir=$1
    if ! check_dir_exists "$dir"; then
        mkdir -p "$dir"
        echo -e "${GREEN}? 成功创建目录：${dir}${NC}"
    fi
}

# 设置nofile限制
function set_nofile_limit() {
    local type=$1
    local value=$2
    if ! grep -q "^* $type nofile $value" /etc/security/limits.conf; then
        echo "* $type nofile $value" | sudo tee -a /etc/security/limits.conf > /dev/null
        echo -e "${GREEN}? 设置 * $type nofile $value 成功${NC}"
    else
        echo -e "${GREEN}? * $type nofile $value 已存在，跳过设置${NC}"
    fi
}

# 检查镜像是否存在
function check_image_exists() {
    local image=$1
    if docker image inspect "$image" &> /dev/null; then
        echo -e "${GREEN}? 镜像 ${image} 已存在${NC}"
        return 0
    else
        echo -e "${RED}× 镜像 ${image} 不存在${NC}"
        return 1
    fi
}

# 创建数据目录
echo -e "\n创建数据目录..."
create_dir "$ES_DATA_DIR/data01"
create_dir "$ES_DATA_DIR/plugins"
create_dir "$ES_DATA_DIR/logs"

# 移动插件
echo -e "\n移动IK插件..."
if [ -d "./ik" ]; then
    mv ./ik "$ES_DATA_DIR/plugins/" && echo -e "${GREEN}? IK插件移动成功${NC}"
else
    echo -e "${RED}× IK插件目录不存在，跳过移动操作${NC}"
fi

# 设置目录权限
echo -e "\n设置目录权限..."
if [ ! -w "$ES_DATA_DIR" ]; then
    chmod -R 775 "$ES_DATA_DIR" && echo -e "${GREEN}? 权限设置成功${NC}"
else
    echo -e "${GREEN}? 目录权限已设置，跳过修改${NC}"
fi

# 设置vm.max_map_count
echo -e "\n设置vm.max_map_count..."
current_max_map=$(sysctl -n vm.max_map_count)
if [ "$current_max_map" -ne "$MAX_MAP_COUNT_TARGET" ]; then
    sudo sysctl -w vm.max_map_count="$MAX_MAP_COUNT_TARGET"
    echo "vm.max_map_count=$MAX_MAP_COUNT_TARGET" | sudo tee -a /etc/sysctl.conf > /dev/null
    sudo sysctl -p
    echo -e "${GREEN}? vm.max_map_count 已设置为 $MAX_MAP_COUNT_TARGET${NC}"
else
    echo -e "${GREEN}? vm.max_map_count 已是目标值 $MAX_MAP_COUNT_TARGET，跳过设置${NC}"
fi

# 设置nofile限制
echo -e "\n设置文件描述符限制..."
set_nofile_limit "hard" "$NOFILE_LIMIT"
set_nofile_limit "soft" "$NOFILE_LIMIT"
ulimit -n "$NOFILE_LIMIT"

# 检查镜像并加载
echo -e "\n检查Elasticsearch镜像..."
if ! check_image_exists "$ES_IMAGE"; then
    if [ -f "elastic-8.6.0.tar" ]; then
        docker load -i elastic-8.6.0.tar && echo -e "${GREEN}? 镜像加载成功${NC}"
    else
        echo -e "${RED}× 未找到本地镜像文件 elastic-8.6.0.tar${NC}"
        exit 1
    fi
else
    echo -e "${GREEN}? 镜像已存在，跳过加载${NC}"
fi

# 启动服务
echo -e "\n启动Elasticsearch服务..."
if [ -d "$IK_PLUGIN_DIR" ]; then
    docker-compose up -d && echo -e "${GREEN}? 服务启动成功${NC}"
else
    echo -e "${RED}× IK插件目录不存在，请检查插件安装${NC}"
    exit 1
fi

# 输出后续操作提示
echo -e "\n\033[1m部署完成，请执行以下操作验证：\033[0m"
echo -e "1. 查看日志：${GREEN}docker-compose logs -f rag-es01${NC}"
echo -e "2. 验证ES状态：${GREEN}curl -u elastic:MJygtpFQ7o8zvJMCTdFX http://localhost:9200${NC}"
